part of '../authentication.dart';

/// 向特定的手机号发送信息
/// 如果是在非Linux系统上，则不真实发送，转而将验证码字符串放在body中返回
///
/// 要求手机号，将手机号放在body中
Handler sendSms = (Request request) async {
  // 读取手机号
  final String phone = request.body.getField<String>("phone", "必须传入手机号才能发送短信");

  // 找到或创建手机号对应的用户
  final User user = await userTable.findOrCreate(phone);
  // 确保用户的验证码没有在冷却
  if (user.sms?.isCooldown == true) throw Bug("验证码刚发送完，正在冷却中，请稍后再试");

  // 生成一个新的验证码，如果是在Linux服务器中运行，那么给手机号发送真实短信
  final sms = Sms.create(expireTime: Duration(minutes: 10)); // 有效期10分钟
  if (Platform.isLinux) await SmsKit.sendWithYunpian(phone, sms.code);

  // 发送完成后，将sms信息添加到user中并保存
  user.sms = sms;
  await userTable.update(user);

  // 如果验证码没有发送出去，那么需要通过response返回
  return responseOK(Platform.isLinux ? null : sms.code);
};
